﻿using System;

public static class Event {
    /// <summary>
    /// 달력에 이벤트를 추가
    /// </summary>
    /// <param name="userId">이벤트 작성자 ID</param>
    /// <param name="calendarId">이벤트를 추가할 달력의 ID</param>
    /// <param name="name">이벤트 이름</param>
    /// <param name="description">이벤트 설명</param>
    /// <param name="location">이벤트 위치</param>
    /// <param name="utcStart">이벤트 시작</param>
    /// <param name="utcEnd">이벤트 끝</param>
    /// <param name="allDay">이벤트가 종일인지 여부입니다. 종일인 경우
    /// 시작 및 끝 TIMES는 역할을 수행하지 않습니다.</param>
    /// <remarks>같은 날 시작하고 끝나는 이벤트만 지원됩니다.</remarks>
    /// <returns>추가된 이벤트의 ID</returns>
    public static int AddEvent(int userId, int calendarId, string name, string description, string location, DateTime utcStart, DateTime utcEnd, int don, bool allDay = false) {
        var db = UserHelper.DatabaseInstance;
        db.Query(@"INSERT INTO Events
                    (OrganizerId,   CalendarId,     Name,   Description,    Location,   AllDay, Start,  [End], Don)
             Values (@0,            @1,             @2,             @3,         @4,     @5,     @6,     @7,    @8)",
                    userId, calendarId, name, description, location, allDay, utcStart, utcEnd, don);

        return Convert.ToInt32(db.GetLastInsertId());
    }

    /// <summary>
    /// 이벤트 편집
    /// </summary>
    /// <see>Event.AddEvent</see>>
    /// <param name="eventId">편집할 이벤트 ID</param>
    public static void EditEvent(int eventId, int calendarId, string name, string description, string location, DateTime utcStart, DateTime utcEnd, int don, bool allDay = false) {
        var db = UserHelper.DatabaseInstance;

        db.Execute(@"
                    UPDATE Events
                    SET CalendarId = @0, Name = @1, Description = @2, Location = @3, AllDay = @4, Start = @5, [End] = @6, Don = @8
                    WHERE Id = @7",
                    calendarId, name, description, location, allDay, utcStart, utcEnd,
                    eventId, don);
    }

    /// <summary>
    /// 이벤트 삭제
    /// </summary>
    /// <param name="eventId">삭제할 이벤트 ID</param>
    public static void DeleteEvent(int eventId) {
        var db = UserHelper.DatabaseInstance;

        db.Execute("DELETE FROM EVENTS WHERE Id = @0", eventId);
    }

    /// <summary>
    /// 사용자-달력-이벤트 짝에 대한 정보 가져오기
    /// </summary>
    /// <param name="userId">찾을 사용자 ID</param>
    /// <param name="eventId">찾을 이벤트 ID</param>
    /// <returns>해당 쌍과 일치하는 결과가 없는 경우 Null이고 그렇지 않으면 쌍과 관련된 정보입니다.</returns>
    public static dynamic GetUserEvent(int userId, int eventId) {
        var db = UserHelper.DatabaseInstance;
        return db.QuerySingle(@"
            SELECT e.*, c.Name AS CalendarName, c.Id AS CalendarId, cu.Color, cu.Permissions
            FROM EVENTS AS e 
            JOIN Calendars AS c ON e.CalendarID = c.Id 
            JOIN CalendarsUsers AS cu ON c.Id = cu.CalendarId
            WHERE cu.UserId = @0 AND e.Id = @1",
            userId, eventId);
    }

    public static dynamic GetCalendarEvents(int calendarId) {
        var db = UserHelper.DatabaseInstance;
        return db.Query("SELECT * FROM Events WHERE CalendarId = @0", calendarId);
    }
}